package com.itcam.example;

import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;

/**
 * 🌟 @Command 注解用于定义命令行工具的基本信息。
 * - name: 命令的名称，用户在命令行中使用此名称调用该工具。
 * - version: 工具的版本号，方便用户了解工具的版本信息。
 * - mixinStandardHelpOptions: 启用标准的帮助选项，如 --help 和 --version。
 */
@Command(name = "ASCIIArt", version = "ASCIIArt 1.0", mixinStandardHelpOptions = true)
/**
 * 🌟 ASCIIArt 类实现了 Runnable 接口，用于将输入的单词转换为 ASCII 艺术字。
 * 该类使用 picocli 库处理命令行参数，并提供了基本的配置选项。
 */
public class ASCIIArt implements Runnable {

    /**
     * 🔠 @Option 注解用于定义命令行选项。
     * - names: 选项的名称，用户可以使用 -s 或 --font-size 来指定字体大小。
     * - description: 选项的描述信息，帮助用户了解该选项的作用。
     *
     * 默认字体大小为 19。
     */
    @Option(names = {"-s", "--font-size"}, description = "Font size")
    int fontSize = 19;

    /**
     * 📝 @Parameters 注解用于定义命令行参数。
     * - paramLabel: 参数的标签，用于在帮助信息中显示。
     * - defaultValue: 参数的默认值，如果用户未提供参数，则使用此默认值。
     * - description: 参数的描述信息，帮助用户了解该参数的作用。
     *
     * 默认单词为 "Hello, picocli"。
     */
    @Parameters(paramLabel = "<word>", defaultValue = "Hello, picocli",
            description = "Words to be translated into ASCII art.")
    private String[] words = {"Hello,", "picocli"};

    /**
     * 🚀 实现 Runnable 接口的 run 方法，该方法是程序的核心执行逻辑。
     * 在该方法中，将打印当前设置的字体大小和要转换为 ASCII 艺术字的单词。
     */
    @Override
    public void run() {
        // 打印当前设置的字体大小
        System.out.println("fontSize = " + fontSize);
        // 打印要转换为 ASCII 艺术字的单词，使用逗号连接数组元素
        System.out.println("words = " + String.join(",", words));
    }

    /**
     * 🌟 程序的入口点，用于启动命令行工具。
     *
     * 在该方法中，创建一个 CommandLine 对象，并传入 ASCIIArt 类的实例，
     * 然后执行命令行参数，根据执行结果设置退出码并退出程序。
     *
     * @param args 命令行参数，用户在命令行中输入的参数。
     */
    public static void main(String[] args) {
        // 创建 CommandLine 对象并执行命令行参数，获取执行结果的退出码
        int exitCode = new CommandLine(new ASCIIArt()).execute(args);
        // 根据退出码退出程序
        System.exit(exitCode);
    }
}

